<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
	</head>
	<body>
		<script type="text/javascript">
			//JavaScript的变量与其他语言的变量有很大区别。
			//JavaScript变量松散类型的本质，决定了它只是在特定时间用于保存特定值的一个名字而已。
			//由于不存在定义某个变量必须要保存何种数据类型值的规则，变量的值及其数据类型可以在脚本的生命周期内改变。
			
			
			//1.基本数据类型：undefined null boolean number string，这5种是按值访问的，因为可以操作保存在变量中的实际的值
			//2.引用类型的值是保存在内存中的对象，引用类型的值是按引用访问的，在操作对象时，实际上是在操作对象的引用而不是实际的对象
			// （这种说法不严密，当复制保存着对象的某个变量时，操作的是对象的引用。但在为对象添加属性时，操作的是实际的对象。）
			
			
			//4.1.1 动态的属性
			      //对于引用类型的值，我们可以为其添加属性和方法，也可以改变和删除其属性和方法。
//				       var person = new Object();//创建了一个对象并将其保存在变量person中
//				       person.name = "ls";//为该对象添加了一个名为name的属性，并将字符串值"ls"赋给了这个属性
//				       alert(person.name);//ls，通过alert()函数访问了这个新属性
			  	 //我们不能给基本类型的值添加属性，尽管这样做不会导致任何错误
//			      	   var name = "ls";
//			           name.age = 27;
//			           alert(name.age);//undefined

           //4.1.2 复制变量值
               //从一个变量向另一个变量复制基本类型的值，会在变量对象上创建一个新值，然后把该值复制到为新变量分配的位置上。
               //num1 中保存的值是 5。当使用 num1 的值来初始化 num2 时，num2 中也保存了值 5。
               //但 num2中的 5 与 num1 中的 5 是完全独立的，该值只是 num1 中 5 的一个副本
//	               var num1 = 5;
//	               var num2 = num1;
	               
	           //从一个变量向另一个变量复制引用类型的值，同样也会将存储在变量对象中的值复制一份放到为新变量分配的空间中。
	           //不同的是，这个值的副本实际上是一个指针，而这个指针指向存储在堆中的一个对象。
	           //改变其中一个变量，就会影响另一个变量
//	               var obj1 = new Object();
//	               var obj2 = obj1;
//	               obj1.name = "ls";
//	               console.log(obj2.name);//ls


               //4.1.3 传递参数
                   //ECMAScript 中所有函数的参数都是按值传递的。
                   //把函数外部的值复制给函数内部的参数，就和把值从一个变量复制到另一个变量一样。
//                 function addTen(num){
//                 	 num += 10;
//                 	 return num;
//                 }
//                 var count = 20;
//                 var result = addTen(count);
//                 console.log(count);//20,没有变化
//                 console.log(result);//30
                   
//                 function setName(obj){
//                 	  obj.name = "ls";
//                 	  obj = new Object();
//                 	  obj.name = "xxx"
//                 }
//                 var person = new Object();
//                 setName(person);
//                 console.log(person.name);//ls
              //4.1.4 检测类型
                 //typeof 操作符是确定一个变量是字符串、数值、布尔值，还是 undefined 的最佳工具。
                 //如果变量的值是一个对象或 null，则 typeof 操作符会返回object
                 var s = "ls";
                 var b = true;
                 var i = 22;
                 var u;
                 var n = null;
                 var o = new Object();
                 console.log(typeof s);
                 console.log(typeof b);
                 console.log(typeof i);
                 console.log(typeof u);
                 console.log(typeof n);
                 console.log(typeof o);
                 console.log(n instanceof Object); 
		</script>
	</body>
</html>
